//package cn.xieyang.gen.xdemo;
//
//import cn.hutool.core.io.FileUtil;
//import cn.xieyang.gen.config.DBConfig;
//import cn.xieyang.gen.xdemo.config.AppGenCodeConfig;
//import com.baomidou.mybatisplus.core.toolkit.StringPool;
//import com.baomidou.mybatisplus.generator.FastAutoGenerator;
//import com.baomidou.mybatisplus.generator.config.OutputFile;
//import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
//import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
//import com.baomidou.mybatisplus.generator.config.po.TableInfo;
//import com.baomidou.mybatisplus.generator.config.rules.DateType;
//import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
//import com.xieyang.xtools.utils.XSerialNoUtil;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//
//import java.io.File;
//import java.nio.charset.StandardCharsets;
//import java.util.*;
//import java.util.function.BiConsumer;
//import java.util.function.Function;
//
///**
// * 应用代码生成器
// */
//@Slf4j
//@Data
//public class AppCodeGenerator {
//
//    /**
//     * 数据库连接配置
//     */
//    private DBConfig dbConfig;
//
//    /**
//     * 应用代码生成配置
//     */
//    private AppGenCodeConfig genCodeConfig;
//
//    /**
//     * 自定义代码区-开始标志
//     */
//    private final String CUSTOMER_AREA_START_MARK = "// ==============================customer area start==============================";
//
//    /**
//     * 自定义代码区-结束标志
//     */
//    private final String CUSTOMER_AREA_END_MARK = "// ==============================customer area end==============================";
//
//    /**
//     * 已存在代码中import、annotation和类定义区域-开始标志
//     */
//    private final String IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK = "// ==============================import and annotation and classDefine customer area start==============================";
//
//    /**
//     * 已存在代码中import、annotation和类定义区域-结束标志
//     */
//    private final String IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK = "// ==============================import and annotation and classDefine customer area end==============================";
//
//    /**
//     * xml的mapper文件的自定义区-开始标志
//     */
//    private final String XML_CUSTOMER_AREA_START_MARK = "<!--customer area start-->";
//
//    /**
//     * xml的mapper文件的自定义区-结束标志
//     */
//    private final String XML_CUSTOMER_AREA_END_MARK = "<!--customer area end-->";
//
//    /**
//     * 构造器
//     *
//     * @param dbConfig      数据库连接配置
//     * @param genCodeConfig 应用代码生成配置
//     */
//    public AppCodeGenerator(DBConfig dbConfig, AppGenCodeConfig genCodeConfig) {
//        // 数据库连接配置
//        this.dbConfig = dbConfig;
//        // 应用代码生成配置
//        this.genCodeConfig = genCodeConfig;
//    }
//
//    /**
//     * 配置检查
//     *
//     * @return 是否通过检查
//     */
//    private boolean check() {
//        boolean rs = true;
//        log.info("流水号：{}，开始检查配置", XSerialNoUtil.getId());
//
//        if (rs) {
//            log.info("流水号：{}，检查配置通过", XSerialNoUtil.getId());
//        } else {
//            log.info("流水号：{}，检查配置不通过", XSerialNoUtil.getId());
//        }
//        return rs;
//    }
//
//    public void gen() {
//        if (!check()) {
////            log.info();
//            return;
//        }
//        HashSet<String> filePathSet = new HashSet<>();
//        FastAutoGenerator fastAutoGenerator = FastAutoGenerator
//                .create(dbConfig.getUrl(), // 数据库连接 URL
//                        dbConfig.getUserName(), // 数据库用户名
//                        dbConfig.getPassword()) // 数据库密码
//                .globalConfig(builder -> {
//                    builder.author(genCodeConfig.getAuthor()) // 设置作者
//                            .enableSwagger()        // 开启 swagger 模式 默认值:false
//                            .disableOpenDir()       // 禁止打开输出目录 默认值:true
//                            // 关闭注释日期，防止没有改动也修改日期
////                            .commentDate("yyyy-MM-dd") // 注释日期
//                            .dateType(DateType.ONLY_DATE);   // 定义生成的实体类中日期类型 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
//                }).packageConfig(builder -> {
//                    Map<OutputFile, String> pathInfoMap = new HashMap<>();
//                    pathInfoMap.put(OutputFile.entity, genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/com/xieyang/infra/data");
//                    pathInfoMap.put(OutputFile.xml, genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/resources/mapper");
//                    pathInfoMap.put(OutputFile.mapper, genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/com/xieyang/infra/mapper");
//                    pathInfoMap.put(OutputFile.service, genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/com/xieyang/infra/myservice");
//                    pathInfoMap.put(OutputFile.serviceImpl, genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/com/xieyang/infra/service/impl");
//                    pathInfoMap.put(OutputFile.controller, genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-adapter/src/main/java/com/xieyang/adapter/controller");
//                    builder.parent("com") // 设置父包名
//                            .moduleName("xieyang") // 设置模块名（如：model, mapper, service）
//                            .entity("infra.data") // 实体类所在子包
//                            .mapper("infra.mapper") // Mapper 接口所在子包
//                            .service("infra.myservice") // Service 类所在子包
//                            .serviceImpl("infra.service.impl") // Service 类所在子包
//                            .controller("adapter.controller") //controller类所在子包
//                            .pathInfo(pathInfoMap) // 设置文件生成路径，xml文件默认存放在mapper的xml下
//                    ;
//                }).injectionConfig(consumer -> {
//                    List<BiConsumer<TableInfo, Map<String, Object>>> oprlist = new ArrayList<>();
//                    List<CustomFile> customFileList = new ArrayList<>();
//                    HashMap<String, Object> customMap = new HashMap<>();
//                    // mp底层配置
//                    // 关闭lombok注解,生成setter和getter方法
//                    customMap.put("entityLombokModel", false);
//                    // 开启 chainModel ,set 返回this
//                    customMap.put("chainModel", true);
//                    // abs
//                    injectAbsConfig(customFileList, customMap, oprlist);
//                    // dataSource
//                    injectDataSourceConfig(customFileList, customMap, oprlist);
//                    // Data.java
//                    injectDataConfig(customFileList, customMap, oprlist, filePathSet);
//                    // BO.java
//                    injectBOConfig(customFileList, customMap, oprlist, filePathSet);
//                    // DO.java
//                    injectDOConfig(customFileList, customMap, oprlist, filePathSet);
//                    // Mapper.xml
//                    injectXmlConfig(customFileList, customMap, oprlist, filePathSet);
//                    // Mapper.java
//                    injectMapperConfig(customFileList, customMap, oprlist, filePathSet);
//                    // Service.java
//                    injectIServiceConfig(customFileList, customMap, oprlist, filePathSet);
//                    // ServiceImpl.java
//                    injectIServiceImplConfig(customFileList, customMap, oprlist, filePathSet);
//                    // DbExchanger.java
//                    injectDbExchangerConfig(customFileList, customMap, oprlist, filePathSet);
//                    // DbExchangerImpl.java
//                    injectDbExchangerImplConfig(customFileList, customMap, oprlist, filePathSet);
//                    // 业务层-start
//                    // BizRequestDTO.java
//                    injectBizRequestDTOConfig(customFileList, customMap, oprlist, filePathSet);
//                    // BizResponseDTO.java
//                    injectBizResponseDTOConfig(customFileList, customMap, oprlist, filePathSet);
//                    // BizRequestBO.java
//                    injectBizRequestBOConfig(customFileList, customMap, oprlist, filePathSet);
//                    // BizResponseBO.java
//                    injectBizResponseBOConfig(customFileList, customMap, oprlist, filePathSet);
//                    // BizService.java
//                    injectBizServiceConfig(customFileList, customMap, oprlist, filePathSet);
//                    // Api.java
//                    injectApiConfig(customFileList, customMap, oprlist, filePathSet);
//                    // Controller.java
//                    injectControllerConfig(customFileList, customMap, oprlist, filePathSet);
//                    // 业务层-end
//                    // objectMap，所有的模版变量都在
//                    consumer.beforeOutputFile((tableInfo, objectMap) -> {
//                        oprlist.forEach(curOpr -> curOpr.accept(tableInfo, objectMap));
//                    });
//                    consumer.customFile(customFileList);
//                    consumer.customMap(customMap);
//                }).strategyConfig(builder -> {
//                    builder.addInclude(genCodeConfig.getInclude()) // 多张表，用逗号","分隔
//                            .addTablePrefix(genCodeConfig.getPrefix()) // 表前缀（如果有） .addTablePrefix("tb_", "gms_") // 设置过滤表前缀
//                            .addTableSuffix("cm_") // 表后缀（如果有），生成${entity}的时候，会删除掉后缀
//                            .addTableSuffix("_tbl") // 表后缀（如果有），生成${entity}的时候，会删除掉后缀
//                            // entity
//                            .entityBuilder() // 实体策略配置
//                            .enableLombok()
//                            .enableFileOverride()
//                            .disable() // 禁止生产entity文件
//                            // mapper
//                            .mapperBuilder()// mapper策略配置
//                            .disable()
//                            .formatMapperFileName("%sMapper").enableMapperAnnotation()   //@mapper注解开启,@Deprecated
//                            .formatXmlFileName("%sMapper").enableFileOverride()
//                            // controller
//                            .controllerBuilder() // controller 策略配置
//                            .disable()
//                            .formatFileName("%sController").enableRestStyle() // 开启RestController注解
//                            .enableFileOverride()
//                            // service
//                            .serviceBuilder()// service策略配置
//                            .disable()
//                            .formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl").enableFileOverride();
//                })
//                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
//                .templateEngine(new FreemarkerTemplateEngine());
//        // 执行代码生成
//        try {
//            fastAutoGenerator.execute();
//            log.info("生成成功!");
//        } catch (Exception e) {
//            filePathSet.stream().forEach(filePath -> {
//                if (FileUtil.exist(filePath)) {
//                    // 暂时不删除文件
//                    // FileUtil.del(filePath);
//                }
//            });
//            log.error("生成失败!", e);
//        }
//    }
//
//    private void injectDataSourceConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist) {
//        // 数据源变量
//        HashMap<String, String> curVars = new HashMap<>();
//        curVars.put("dataSourceName", dbConfig.getDataSourceName());
//        customMap.put("dsVars", curVars);
//    }
//
//    private void injectBizServiceConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("BizService.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/bizService.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-domain/src/main/java/")
//                .packageName("com.xieyang.domain.service")
//                .enableFileOverride().build();
//        // bo 模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.domain.service");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("bizServiceVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//    private void injectBizResponseBOConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("BizResponseBO.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/bizResponseBO.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-domain/src/main/java/")
//                .packageName("com.xieyang.domain.bo")
//                .enableFileOverride().build();
//        // bo 模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.domain.bo");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("bizResponseBOVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//    private void injectBizRequestBOConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("BizRequestBO.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/bizRequestBO.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-domain/src/main/java/")
//                .packageName("com.xieyang.domain.bo")
//                .enableFileOverride().build();
//        // bo 模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.domain.bo");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("bizRequestBOVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//    private void injectBizResponseDTOConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("BizResponseDTO.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/bizResponseDTO.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-dto/src/main/java/")
//                .packageName("com.xieyang.dto").enableFileOverride().build();
//        // api模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.dto");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("bizResponseDTOVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//    private void injectBizRequestDTOConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("BizRequestDTO.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/bizRequestDTO.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-dto/src/main/java/")
//                .packageName("com.xieyang.dto").enableFileOverride().build();
//        // api模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.dto");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("bizRequestDTOVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//    private void injectDbExchangerImplConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("DbExchangerImpl.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/dbExchangerImpl.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/")
//                .packageName("com.xieyang.infra.exchanger").enableFileOverride().build();
//        // mapper模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.infra.exchanger");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> mapperOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String fileName = "";
//            ConfigBuilder configBuilder = (ConfigBuilder) objectMap.get("config");
//            Map<OutputFile, String> pathInfo = configBuilder.getPathInfo();
//            String filePath = pathInfo.get(OutputFile.mapper);
//            if (Objects.nonNull(filePath) && filePath.endsWith(File.separator)) {
//                fileName = filePath + entityName + "DbExchangerImpl.java";
//            } else {
//                fileName = filePath + File.separator + entityName + "DbExchangerImpl.java";
//            }
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        oprlist.add(mapperOpr);
//        customMap.put("dbExchangerImplVars", curVars);
//    }
//
//    private void injectDbExchangerConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("DbExchanger.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/dbExchanger.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-domain/src/main/java/")
//                .packageName("com.xieyang.domain.exchanger").enableFileOverride().build();
//        // mapper模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.domain.exchanger");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> mapperOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String fileName = "";
//            ConfigBuilder configBuilder = (ConfigBuilder) objectMap.get("config");
//            Map<OutputFile, String> pathInfo = configBuilder.getPathInfo();
//            String filePath = pathInfo.get(OutputFile.mapper);
//            if (Objects.nonNull(filePath) && filePath.endsWith(File.separator)) {
//                fileName = filePath + entityName + "DbExchanger.java";
//            } else {
//                fileName = filePath + File.separator + entityName + "DbExchanger.java";
//            }
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        oprlist.add(mapperOpr);
//        customMap.put("dbExchangerVars", curVars);
//    }
//
//
//    private void injectMapperConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("Mapper.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/mapper.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/")
//                .packageName("com.xieyang.infra.mapper").enableFileOverride().build();
//        // mapper模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.infra.mapper");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> mapperOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String fileName = "";
//            ConfigBuilder configBuilder = (ConfigBuilder) objectMap.get("config");
//            Map<OutputFile, String> pathInfo = configBuilder.getPathInfo();
//            String filePath = pathInfo.get(OutputFile.mapper);
//            if (Objects.nonNull(filePath) && filePath.endsWith(File.separator)) {
//                fileName = filePath + entityName + "Mapper.java";
//            } else {
//                fileName = filePath + File.separator + entityName + "Mapper.java";
//            }
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        oprlist.add(mapperOpr);
//        customMap.put("mapperVars", curVars);
//    }
//
//    private void injectXmlConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("Mapper.xml")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/mapper.xml.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/resource/mapper/")
//                .enableFileOverride().build();
//        // mapper模版变量
//        HashMap<String, String> xmlVars = new HashMap<>();
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> xmlOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            xmlVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, XML_CUSTOMER_AREA_START_MARK, XML_CUSTOMER_AREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        oprlist.add(xmlOpr);
//        customMap.put("xmlVars", xmlVars);
//    }
//
//    private void injectIServiceConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("IService.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/iService.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/")
//                .packageName("com.xieyang.infra.iService").enableFileOverride().build();
//        // mapper模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.infra.iService");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> serviceOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String fileName = "";
//            ConfigBuilder configBuilder = (ConfigBuilder) objectMap.get("config");
//            Map<OutputFile, String> pathInfo = configBuilder.getPathInfo();
//            String filePath = pathInfo.get(OutputFile.service);
//            if (Objects.nonNull(filePath) && filePath.endsWith(File.separator)) {
//                fileName = filePath + entityName + "Service.java";
//            } else {
//                fileName = filePath + File.separator + entityName + "Service.java";
//            }
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        oprlist.add(serviceOpr);
//        customMap.put("iServiceVars", curVars);
//    }
//
//    private void injectIServiceImplConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("IServiceImpl.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/iServiceImpl.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/")
//                .packageName("com.xieyang.infra.iService.impl").enableFileOverride().build();
//        // mapper模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.infra.iService.impl");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> serviceImplOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String fileName = "";
//            ConfigBuilder configBuilder = (ConfigBuilder) objectMap.get("config");
//            Map<OutputFile, String> pathInfo = configBuilder.getPathInfo();
//            String filePath = pathInfo.get(OutputFile.serviceImpl);
//            if (Objects.nonNull(filePath) && filePath.endsWith(File.separator)) {
//                fileName = filePath + entityName + "ServiceImpl.java";
//            } else {
//                fileName = filePath + File.separator + entityName + "ServiceImpl.java";
//            }
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        oprlist.add(serviceImplOpr);
//        customMap.put("iServiceImplVars", curVars);
//    }
//
//    private void injectDataConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName(".java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/data.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-common/src/main/java/")
//                .packageName("com.xieyang.common.data")
//                .enableFileOverride().build();
//        // data 模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.common.data");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("dataVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//
//    private void injectBOConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("BO.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/BO.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-domain/src/main/java/")
//                .packageName("com.xieyang.domain.bo")
//                .enableFileOverride().build();
//        // bo 模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.domain.bo");
//        // data 包名
//        curVars.put("dataPackageName", "com.xieyang.common.data");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("boVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//    private void injectDOConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                .fileName("DO.java")
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/DO.java.ftl")
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-infra/src/main/java/")
//                .packageName("com.xieyang.infra.data")
//                .enableFileOverride().build();
//        // do 模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.infra.data");
//        // data 包名
//        curVars.put("dataPackageName", "com.xieyang.common.data");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> curOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("doVars", curVars);
//        oprlist.add(curOpr);
//    }
//
//
//    private void injectAbsConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist) {
//        // 抽象层模版变量
//        HashMap<String, String> absVars = new HashMap<>();
//        absVars.put("customerAreaStartMark", CUSTOMER_AREA_START_MARK);
//        absVars.put("customerAreaEndMark", CUSTOMER_AREA_END_MARK);
//        absVars.put("xmlCustomerAreaStartMark", XML_CUSTOMER_AREA_START_MARK);
//        absVars.put("xmlCustomerAreaEndMark", XML_CUSTOMER_AREA_END_MARK);
//        absVars.put("importAnnotationClassDefineAreaStartMark", IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK);
//        absVars.put("importAnnotationClassDefineAreaEndMark", IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK);
//        customMap.put("abs", absVars);
//    }
//
//    /**
//     * 生成api.java文件的配置
//     *
//     * @param customFileList 自定义模板文件配置
//     * @param customMap      自定义配置 Map 对象
//     * @param oprlist        根据tableInfo和objectMap，生成模版变量，并放入模版变量Map中的操作
//     * @param filePathSet
//     */
//    private void injectApiConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                // 生成文件的后缀，${entity}Api.java
//                .fileName("Api.java")
//                // 模版文件路径，相对路径
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/api.java.ftl")
//                // 顶级包名的父目录位置，绝对路径
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-api/src/main/java")
//                // 包名
//                .packageName("com.xieyang.api")
//                // 文件名称格式化，根据表信息组装文件名。组装规则：entityName + fileName
//                .formatNameFunction(TableInfo::getEntityName)
//                // 文件存在，则覆盖
//                .enableFileOverride().build();
//        // api模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.api");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> apiOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("apiVars", curVars);
//        oprlist.add(apiOpr);
//    }
//
//    /**
//     * 生成 controller.java文件的配置
//     *
//     * @param customFileList 自定义模板文件配置
//     * @param customMap      自定义配置 Map 对象
//     * @param oprlist        根据tableInfo和objectMap，生成模版变量，并放入模版变量Map中的操作
//     * @param filePathSet
//     */
//    private void injectControllerConfig(List<CustomFile> customFileList, HashMap<String, Object> customMap, List<BiConsumer<TableInfo, Map<String, Object>>> oprlist, HashSet<String> filePathSet) {
//        CustomFile file = new CustomFile.Builder()
//                // 生成文件的后缀，${entity}Controller.java
//                .fileName("Controller.java")
//                // 模版文件路径，相对路径
//                .templatePath("/templates/" + genCodeConfig.getAppName() + "/controller.java.ftl")
//                // 顶级包名的父目录位置，绝对路径
//                .filePath(genCodeConfig.getTargetProjectDirLocal() + "/" + genCodeConfig.getAppName() + "-adapter/src/main/java")
//                // 包名
//                .packageName("com.xieyang.adapter.controller")
//                // 文件名称格式化，根据表信息组装文件名。组装规则：entityName + fileName
//                .formatNameFunction(TableInfo::getEntityName)
//                // 文件存在，则覆盖
//                .enableFileOverride().build();
//        // api模版变量
//        HashMap<String, String> curVars = new HashMap<>();
//        // 包名
//        curVars.put("packageName", "com.xieyang.adapter.controller");
//        // 根据tableInfo和objectMap，生成模版变量，并放入模版变量Map
//        BiConsumer<TableInfo, Map<String, Object>> apiOpr = (tableInfo, objectMap) -> {
//            // 表entity名。若配置去掉tbl后缀，则entityName无entity后缀。
//            String entityName = tableInfo.getEntityName();
//            //<editor-fold desc="根据com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.outputCustomFile方法，提取部分代码，并修改，获取输出文件绝对路径">
//            String filePath = file.getFilePath();
//            if (StringUtils.isNotBlank(file.getPackageName())) {
//                filePath = filePath + File.separator + file.getPackageName().replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
//            }
//            Function<TableInfo, String> formatNameFunction = file.getFormatNameFunction();
//            String fileName = filePath + File.separator + (null != formatNameFunction ? formatNameFunction.apply(tableInfo) : entityName) + file.getFileName();
//            //</editor-fold>
//            // 获取原代码中的自定义代码部分，用于放到新代码中
//            curVars.put("customerArea", getMiddleLinesStrByLineMark(fileName, CUSTOMER_AREA_START_MARK, CUSTOMER_AREA_END_MARK));
//            // 获取import、annotation和classDefine部分
//            curVars.put("importAnnotationClassDefineArea", getMiddleLinesStrByLineMark(fileName, IMPORT_ANNOTATION_CLASSDEFINEAREA_START_MARK, IMPORT_ANNOTATION_CLASSDEFINEAREA_END_MARK));
//            // 文件路径添加到集合中
//            filePathSet.add(fileName);
//        };
//        // 添加模板文件配置。若不添加，则不生成文件。
//        customFileList.add(file);
//        customMap.put("controllerVars", curVars);
//        oprlist.add(apiOpr);
//    }
//
//
//    private String getMiddleLinesStrByLineMark(String path, String startMarkLine, String endMarkLine) {
//        return getMiddleLinesStrByLineMark(path, startMarkLine, endMarkLine, true);
//    }
//
//    /**
//     * 获取startMarkLine和endMarkLine的中间行，不包括startMarkLine和endMarkLine。
//     *
//     * @param path          文件绝对路径
//     * @param startMarkLine 开始行标志
//     * @param endMarkLine   结束行标志
//     * @param isTrimLine    是否去除行首和行尾的空格
//     * @return 返回startMarkLine和endMarkLine的中间行
//     */
//    private String getMiddleLinesStrByLineMark(String path, String startMarkLine, String endMarkLine, Boolean isTrimLine) {
//        if (!FileUtil.exist(path)) return "";
//        if (StringUtils.isAnyEmpty(startMarkLine, endMarkLine)) {
//            throw new RuntimeException("startMarkLine和endMarkLine都不能为空");
//        }
//        StringBuilder rs = new StringBuilder();
//        boolean isStartRecord = false;
//        List<String> lines = FileUtil.readLines(path, StandardCharsets.UTF_8);
//
//        for (int i = 0; i < lines.size(); i++) {
//            String curLine = lines.get(i);
//            String nextLine = ((i + 1) <= lines.size() - 1) ? lines.get(i + 1) : "";
//            nextLine = Boolean.TRUE.equals(isTrimLine) ? nextLine.trim() : nextLine;
//            boolean isEndRecordLine = nextLine.equals(endMarkLine);
//            String markLine = Boolean.TRUE.equals(isTrimLine) ? curLine.trim() : curLine;
//            if (isStartRecord) {
//                rs.append(curLine);
//                // 最后一行不添加空行
//                if (!isEndRecordLine) rs.append("\n");
//            }
//            // 从下一行，开始记录
//            if (startMarkLine.equals(markLine)) {
//                isStartRecord = true;
//            }
//            // 从当前行，停止记录，并跳出循环
//            if (isEndRecordLine) break;
//        }
//        return rs.toString();
//    }
//
//}
